package persist

import (
	"context"
	"crawler/config"
	"crawler/engine"
	"errors"
	"log"

	"github.com/olivere/elastic/v7"
)

func ItemSaver(index string) (chan engine.Item, error) {
	client, err := elastic.NewClient(
		// 设置ES服务地址，支持多个地址，逗号分隔
		elastic.SetURL(config.ElasticBaseUrl),
		// 设置基于http base auth验证的账号和密码
		//elastic.SetBasicAuth("user", "secret"),
		// 是否转换请求地址，默认为true,当等于true时 请求http://ip:port/_nodes/http，将其返回的url作为请求路径
		elastic.SetSniff(false))
	if err != nil {
		return nil, err
	}

	out := make(chan engine.Item)
	// 真正执行保存数据的操作
	go func() {
		itemCount := 0
		for {
			item := <-out
			itemCount++
			log.Printf("ItemSaver got item #%d: %v", itemCount, item)
			err := save(client, index, item)
			if err != nil {
				log.Printf("ItemSaver saving error %v: %v", item, err)
				continue
			}
		}
	}()
	return out, nil
}

// es保存数据
func save(client *elastic.Client, index string, item engine.Item) error {
	if item.Type == "" {
		return errors.New("must support type")
	}

	// 使用client创建一个新的文档
	indexService := client.Index().
		Index(index). // 设置索引名称
		//Id("1").
		//Type(item.Type). //v7后废弃，解决方案：1.内容中定义type字段，2.利用索引区分
		BodyJson(item) //内容
	// 设置文档id
	if item.Id != "" {
		indexService.Id(item.Id)
	}

	_, err := indexService.Do(context.Background())
	if err != nil {
		return err
	}

	return nil
}
